package czk.jvm.lecture.classloader;

import sun.misc.Launcher;

import java.util.Properties;

/**
 * 在oracle的hotspot中，系统淑熙sun.boot.class.path如果修改，提示如下错误信息
 *  Error occurred during initialization of VM
 * java/lang/NoClassDefFoundError: java/lang/Object
 */
public class MyTest23 {
    public static void main(String[] args) {
        //启动类加载器加载资源的路径
        System.out.println(System.getProperty("sun.boot.class.path"));
        //扩展类加载器加载资源的路径
        System.out.println(System.getProperty("java.ext.dirs"));
        //系统类加载器所加载的资源的路径
        System.out.println(System.getProperty("java.class.path"));
        //启动类加载器加载系统类加载器 返回值为null
        System.out.println(ClassLoader.class.getClassLoader());
        //扩展类加载器与系统类加载器都是launcher的静态内部类，验证加载launcher的类加载器为启动类加载器
        System.out.println(Launcher.class.getClassLoader());
        //修改系统属性使其默认的系统类加载器变成自定义类加载器
        //控制台修改方如下
        //java -Djava.system.class.path=czk.jvm.lecture.classloader.MyTest16
        Properties properties=new Properties();
        properties.setProperty("java.system.class.loader","czk.jvm.lecture.classloader.MyTest16");
        System.setProperties(properties);

        //系统属性=>此时会返回null,因为并没有改变
        //如果指定，则会返回制定的的值，例如指定czk.jvm.lecture.classloader.MyTest16
        //则会返回czk.jvm.lecture.classloader.MyTest16
        System.out.println(System.getProperty("java.system.class.loader"));
        //如果将java.system.class.loader其指定czk.jvm.lecture.classloader.MyTest16
        //则会返回czk.jvm.lecture.classloader.MyTest16@6d06d69c
        System.out.println(ClassLoader.getSystemClassLoader());
    }
}
